package com.example.swagger.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;

import java.util.ArrayList;
import java.util.List;

//@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI springShopOpenAPI() {
        // 所公开的API的联系人信息
        Contact contact = new Contact()
                // 人或组织的名称
                .name("龙茶清欢")
                // 指向联系人信息的URL地址，必须是URL地址格式
                .url("http://localhost:8888")
                // 人或组织的email地址，必须是email地址格式
                .email("2320391937@qq.com");

        // 公开API的证书信息
        License license = new License()
                // 必选. API的证书名
                .name("Licensed under the Apache License, Version 2.0")
                // 指向API所使用的证书的URL地址，必须是URL地址格式
                .url("http://localhost:8888");

        // 这个对象提供API的元数据。如果客户端需要时可能会用到这些元数据，而且可能会被呈现在编辑工具或者文档生成工具中
        Info info = new Info()
                // 必选. 应用的名称
                .title("测试项目API接口文档")
                // 对应用的简短描述
                .description("测试")
                // 指向服务条款的URL地址，必须是URL地址格式
                .termsOfService("http://localhost:8888")
                // 所开放的API的联系人信息
                .contact(contact)
                // 所开放的API的证书信息
                .license(license)
                // 必选. API文档的版本信息
                .version("1.0.0");

        // 定义一个用于 operations 的 security scheme
        new SecurityScheme()
                .type(SecurityScheme.Type.HTTP)
                .description("定义一个用于 operations 的 security scheme")
                .scheme("bearer")
                .bearerFormat("JWT");

        SecurityRequirement security = new SecurityRequirement()
                .addList("JWT");
        List<SecurityRequirement> list = new ArrayList<>();
        list.add(security);

        // 允许引用外部资源来扩展文档
        ExternalDocumentation externalDocumentation = new ExternalDocumentation()
                .description("允许引用外部资源来扩展文档")
                .url("http://example.com");
        // 这是OpenAPI的根文档对象
        return new OpenAPI()
                // 必选. 这个字符串必须是开放API规范版本号提到的符合语义化版本号规范的版本号
                // 必选。此字段提供API相关的元数据。相关工具可能需要这个字段
                .info(info)
                .security(list)
                // 附加的文档
                .externalDocs(externalDocumentation);
    }

    // 以下分组可省略
    @Bean
    public GroupedOpenApi systemApi() {
        return GroupedOpenApi.builder().group("System系统模块")
                .pathsToMatch("/system/**")
                .build();
    }

    @Bean
    public GroupedOpenApi authApi() {
        return GroupedOpenApi.builder().group("Auth权限模块")
                .pathsToMatch("/captcha", "/login")
                .build();
    }
}

// 配置参考 springdoc-openapi 官网   https://springdoc.org/#Introduction